package pos.gestores;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.Vector;
import java.util.Map.Entry;

import pos.data.IPerfilDAO;
import pos.data.IUsuarioDAO;
import pos.data.JDBCPerfilDAO;
import pos.data.JDBCUsuarioDAO;
import pos.domain.Gusto;
import pos.domain.Usuario;
import pos.utils.Cadenas;
import pos.utils.FlujoEntrada;

public class GestorUsuario {

	public List<Usuario> getUsuarios() {
		List<Usuario> usuarios = (new JDBCUsuarioDAO()).selectAllUsuarios();
		return usuarios;
	}

	public Usuario login(String nick, String password) {
		Usuario usuario = new JDBCUsuarioDAO().selectUsuarioConPerfil(nick,
				password);
		return usuario;

	}

	public Usuario getUsuario(String nick) {
		Usuario usuario = new JDBCUsuarioDAO().selectUsuarioByName(nick);
		return usuario;

	}

	public boolean existeUsuario(String nombre) {
		boolean res = false;
		if (!nombre.equals(null)) {
			IUsuarioDAO iu = new JDBCUsuarioDAO();
			Usuario u = iu.selectUsuarioByName(nombre);
			if (!u.getNombre().equals(null)) {
				res = true;
			}
		}
		return res;

	}

    public void insertarUsuarioNuevo(String nick, String pass, String fechaReg,String email,String codPostal){
		  
		  IUsuarioDAO iu = new JDBCUsuarioDAO();
		  Usuario u = new Usuario(nick,pass,fechaReg,email,codPostal);
		  iu.insertUsuario(u);
		  
	  }
    
    public void insertarGusto(String nick,String estadoCivil,int deporte, String frecuenciaSalida, String trabajo){
    		
    		
    		Gusto g= new Gusto(estadoCivil, deporte, frecuenciaSalida, trabajo);
    		g.setDeporte(deporte);
    		g.setEstadoCivil(estadoCivil);
    		g.setFrecuenciaSalida(frecuenciaSalida);
    		g.setTrabajo(trabajo);
    		IUsuarioDAO iu = new JDBCUsuarioDAO();
    		Usuario u = iu.selectUsuarioByName(nick);
    		IPerfilDAO ip = new JDBCPerfilDAO();
    		ip.insertGustos (g, u);
    		
    	
    }
    public void insertarPerfil(String nick, String nombre, String apellidos,
			 String direccion,String poblacion,
				String provincia,Usuario usuario){
    	
    
    	IPerfilDAO ip= new JDBCPerfilDAO();
   
    	ip.insertPerfil( nombre, apellidos, direccion, poblacion, provincia, usuario.getNombre());
  
    }
    
    public List<String> usuariosCercanos(String nick,String cp){
    	Integer codPostal= new Integer(cp);
    	List<String> res= new LinkedList<String> ();
    	IUsuarioDAO iu = new JDBCUsuarioDAO();
    	List<Usuario> todos = iu.selectAllUsuarios();
    	
    	for(Usuario u :todos){
    		String codP = u.getCodigoPostal();
    		String n = u.getNombre();
    		Integer	codPostalUsuario = null;
    		if( codP != null && !n.equals(nick)){
    			codPostalUsuario = (new Integer(codP));
    		
    		Integer cercania=Math.abs(codPostalUsuario-codPostal);
    		if(cercania<=2){
    			res.add(u.getNombre());
    		}
    		}
    	}
    	
    	if(res.isEmpty())
    	res.add("Debes esperar un poco, aún no hay usuarios que vivan cerca de ti");	    		
    		
    	return res;
    }
    
   public  Map<String, String> generaCodigosPostales(String path) {
		Map<String, String> m = new HashMap<String, String>();
		FlujoEntrada f = new FlujoEntrada(path);
		Vector<String> codigoYCiudad = null;
		for (String s : f) {
			codigoYCiudad = Cadenas.separaElementos(s, ";");
			if(!codigoYCiudad.isEmpty()) //Evita un IndexOutOfBand
			m.put(codigoYCiudad.get(0),codigoYCiudad.get(1) );
		}
		return m;
	}
    public String devuelveProvincia(String codPostal,String path){
    	String provincia=null;
    	String cod = codPostal.substring(0, 2);
    	Map<String, String> m = generaCodigosPostales(path);
    	for( Entry<String, String> s: m.entrySet()){
    		
    		if(s.getKey().equals(cod)){
    			provincia=s.getValue();
    		}
    	}
    	if(provincia.isEmpty())
    		provincia="Alava"; //si la provincia no se ha encontrado poner provincia por defecto
    	return provincia;
    	
    	
    }
    
    
    
    public  Map<String,SortedSet<String>> generaPoblaciones(String path) {
		Map<String,SortedSet<String>> m = new HashMap<String,SortedSet <String>>();
		FlujoEntrada f = new FlujoEntrada(path);
		Vector<String> codigoYPoblacion = null;
		
		for (String s : f) {
			codigoYPoblacion = Cadenas.separaElementos(s, ";");
			if(!codigoYPoblacion.isEmpty()){ //Evita un IndexOutOfBand
				String k =codigoYPoblacion.get(0);
				if(m.containsKey(k)){
					SortedSet<String> l = m.get(k);
					l.add(codigoYPoblacion.get(1));
				}
				else{
					SortedSet<String> listaPoblaciones= new TreeSet<String>();
					m.put(k,listaPoblaciones);
				}
			}}
		return m;
	}
    
    
    public boolean tienePerfil(String nick){
    	boolean tiene=true;
    	
    
    	IUsuarioDAO iu = new JDBCUsuarioDAO();
    	Usuario u =  iu.selectUsuarioConPerfil(nick);
    	
    	if(u.getPerfil().getDirreccion()=="")
    		tiene=false;
    	return tiene;
    }
    
   public void actualizarPerfil(String nombre, String apellidos,
			 String direccion,String poblacion,
				String provincia,String nick){
	   
	   IPerfilDAO ip= new JDBCPerfilDAO();
	   ip.updatePerfil(nombre, apellidos, direccion, poblacion, provincia, nick);
   }
    
   

}
